package Metier;

import java.awt.Point;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import DAO.AttributDAO.AttributDAO;
import Factory.Factory;

public class Table {

	private AttributDAO attributDAO;
	private String nom;
	private List<Attribut> listAttribut = new ArrayList<Attribut>();
	private Point point;
	private int width;

	public Table(String nom)
	{
		this.nom = nom;
		attributDAO = Factory.getAttributDAO();
		point = new Point(0,0);
	}
	public Table(String nom,boolean getAttribut) throws SQLException
	{
		this.nom = nom;
		attributDAO = Factory.getAttributDAO();
		point = new Point(0,0);
		listAttribut = attributDAO.getListAttribut(nom);
	}
	public void createAttribut(Attribut attribut) throws SQLException {
		attributDAO.createAttribut(attribut);
		if(attribut.getPrimaryKey())
			addPrimaryKey(attribut.getNom());
		if(attribut.isUnique())
			addUnique(attribut.getNom());
		if(attribut.getNotNull())
			addNotNull(attribut.getNom());

	}

	public void deleteAttribut(Attribut attribut) throws SQLException {
		attributDAO.deleteAttribut(attribut);
	}

	public void updateAttribut(Attribut attribut, Attribut newAttribut) throws SQLException {
		if (attribut.getPrimaryKey()&&!newAttribut.getPrimaryKey())
			deletePrimaryKey(newAttribut);
		else if (!attribut.getPrimaryKey()&&newAttribut.getPrimaryKey())
		{
			addPrimaryKey(newAttribut.getNom());
		}

		if (attribut.isUnique()&&!newAttribut.isUnique())
			deleteUnique(newAttribut);
		else if (!attribut.isUnique()&&newAttribut.isUnique())
		{
			addUnique(newAttribut.getNom());
		}
		if (attribut.getNotNull()&&!newAttribut.getNotNull())
			deleteNotNull(newAttribut);
		else if (!attribut.getNotNull()&&newAttribut.getNotNull())
		{
			addNotNull(newAttribut.getNom());
		}

		attributDAO.updateAttribut(attribut,newAttribut);
	}

	private void deleteNotNull(Attribut newAttribut) throws SQLException {
		this.attributDAO.deleteNotNull(this.nom,newAttribut.getNom());
	}
	public void addUnique(String nomAttribut) throws SQLException {
		this.attributDAO.createUnique(this.nom,nomAttribut);
	}
	public void addNotNull(String nomAttribut) throws SQLException {
		this.attributDAO.createNotNull(this.nom,nomAttribut);
	}
	public void addPrimaryKey(String nomAttribut) throws SQLException
	{
		ContraintePk cPk = ContraintePk.GetContrainte(this.nom);
		cPk.delete();
		cPk.add(nomAttribut);
		cPk.save();
	}

	public void deletePrimaryKey(Attribut newAttribut)throws SQLException 
	{
		ContraintePk cPk = ContraintePk.GetContrainte(this.nom);
		cPk.delete();
		cPk.remove(newAttribut.getNom());
		cPk.save();
	}

	public void deleteUnique(Attribut newAttribut)throws SQLException 
	{
		String nomContrainte = this.attributDAO.getContrainteUnique(this.nom, newAttribut.getNom());
		this.attributDAO.deleteContrainte(this.nom,nomContrainte);
	}

	public String getNom() {
		return nom;
	}
	public Attribut getAttribut(Attribut attribut) throws SQLException {
		return attributDAO.getAttribut(attribut);
	}
	public List<Attribut> getListeAttribut() throws SQLException {
		List<Attribut> list = attributDAO.getListAttribut(this.nom);
		return list;
	}

	public List<String> getListNomAttribut() throws SQLException {
		List<String> listNom = attributDAO.getListNomAttribut(nom);
		return listNom;
	}

	public boolean isPrimaryKey(String nomAttribut) throws SQLException {
		return attributDAO.isPrimaryKey(this.nom,nomAttribut);
	}

	public List<Boolean> isPrimaryKey(List<String> nomAttributs) throws SQLException {
		List<String> listeAttrPk= attributDAO.getPrimaryKey(this.nom);
		List<Boolean> listeEtat = new ArrayList<Boolean>();
		for (int i = 0; i < nomAttributs.size(); i++) 
		{
			boolean etat=false;
			for (int j = 0; j < listeAttrPk.size(); j++)
			{
				if (listeAttrPk.get(j).toUpperCase().equals(nomAttributs.get(i).toUpperCase()))
					etat=true;
			}
			listeEtat.add(etat);
		}
		return listeEtat;
	}

	public int getX()
	{
		return point.x;
	}

	public int getY()
	{
		return point.y;
	}

	public void setPosition(Point p)
	{
		this.point = p;
	}

	public int getWidth()
	{
		return width;
	}
	public void setLargeur(int width)
	{
		this.width = width;
	}
	public String getAttribut(int index) {
		return this.listAttribut.get(index).getNom();
	}

	public List<String> getAllAttribut()
	{
		List<String> listeNomAttribut = new ArrayList<String>();
		for(int i=0;i<this.listAttribut.size();i++)
		{
			listeNomAttribut.add(this.listAttribut.get(i).getNom());
		}
		return listeNomAttribut;
	}
	public Point getLocation() {
		return this.point;
	}

	public boolean primaryKey(String attribut)
	{
		for(int i=0;i<this.listAttribut.size();i++)
		{
			if (this.listAttribut.get(i).getNom().equals(attribut))
			{
				return this.listAttribut.get(i).isPrimaryKey();
			}
		}
		return false;
	}
	public void miseAJour() throws SQLException {
		listAttribut = attributDAO.getListAttribut(nom);
	}
}
